package com.chenfan.process.config.lock;

import java.util.concurrent.TimeUnit;

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component(value = "distributedLocker")
public class RedisDistributedLocker implements DistributedLocker {

    @Autowired

    private RedissonClient redissonClient;

    @Override

    public RLock lock(String lockKey) {

        RLock lock = redissonClient.getLock(lockKey);

        lock.lock();

        return lock;

    }

    @Override

    public RLock lock(String lockKey, int leaseTime) {

        RLock lock = redissonClient.getLock(lockKey);

        lock.lock(leaseTime, TimeUnit.SECONDS);

        return lock;

    }

    @Override

    public RLock lock(String lockKey, TimeUnit unit, int timeout) {

        RLock lock = redissonClient.getLock(lockKey);

        lock.lock(timeout, unit);

        return lock;

    }

    @Override

    public boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime) {

        RLock lock = redissonClient.getLock(lockKey);

        try {

            return lock.tryLock(waitTime, leaseTime, unit);

        } catch (InterruptedException e) {

            return false;

        }

    }

    @Override

    public void unlock(String lockKey) {

        RLock lock = redissonClient.getLock(lockKey);

        lock.unlock();

    }

    @Override

    public void unlock(RLock lock) {

        lock.unlock();

    }

}